Nginx/OpenResty内存泄露及目录穿越漏洞复现
最近HackerOne公布的Nginx内存内容泄露问题以及目录穿越漏洞,复现看下具体情况
按照公布的消息,这次的漏洞主要是存在于两种情况下
nginx下主要是空字节在rewrite的时候未处理,在内部rewrite的时候,如果response的location部分内容超过实际的长度,结尾部分就会读取到内存里面的内容
openresty下面是在rewrite的时候,使用set_uri进行重写处理的时候,没有处理空字节,导致内存内容泄露,以及在rewrite的时候,如果rewrite目标地址,用变量获取的方式,会导致目录遍历
目前受影响的版本:
nginx <= v1.17.7
openresty <= v1.15.8.2
复现过程:
先来看下openresty,这里安装了1.15.8.2的版本,并且开启了lua模块
按照公示的案例配置
接着,通过curl发起post请求
response中的Location部分的结尾部分就是返回的内存中的部分内容,接着把post参数的数据增加,看下效果
可以获取到的内存内容部分增加
接着看下openresty目录遍历的情况
构造目录穿越访问
对于nginx中,按照公布的消息称nginx小于1.17.7的版本,都有内存内容泄露的漏洞,但是我在本地测试的过程中,测试了nginx1.16.1、nginx1.8.0,都没有复现,测试过程如下:
配置nginx的rewrite,重写为带有空字节的地址
接着通过curl请求,查看结果
复现目录遍历
在nginx中只复现成功目录遍历漏洞,内存内容泄露没有复现成功
按照nginx的rewrite规则,regex部分为正则,匹配之后按照replacement字符串中的指定进行重写,后面可以跟flag,包括last、break、redirect、permanent
如上面测试,根据debug日志查看如下
是将replacement部分匹配到之后,在root目录下查找对应文件,不存在,返回404,按照Hackerone中披露的细节看,是在301/302中Location中存在内存内容泄露,按照nginx的rewrite配置,在redirect或permanent下面才会进行跳转,所以设置之后,再进行测试如下
仍然无法复现
按照rewrite规则来看,当replacement是字符串时,会被当做目录来解析,所以会拼接完整的文件路径,所以这也是为什么目录穿越可以执行,但是内存泄露无法复现的原因
上面两个漏洞被定位低危和中危漏洞,主要是这种配置方式是比较少见的,检查下配置即可,如果有条件的话,建议更新到最新版本
不得不说,空字节导致的漏洞在nginx不是第一次出现了,在之前就出现过%00空字节导致非php文件中嵌入php代码,通过访问url+%00.php的方式执行php代码,所以,在开发过程中空字节的过滤是必须要考虑的,必要的时候可以在waf中进行过滤
openresty3月20号已经发布了1.15.8.3版本,修复了这个漏洞,nginx可以更新到1.17.8以上版本
如果有大佬复现了nginx下内容内存泄露漏洞,不吝赐教
harkerone细节:https://hackerone.com/reports/513236
更多精彩内容请扫描下方二维码关注公众号